package utils

import (
	"database/sql/driver"
	"fmt"
	"time"
)

// 自定义时间类型
type DateTime time.Time

const (
	TimeFormat     = "2006-01-02 15:04:05" // 显示格式
	DatabaseFormat = "2006-01-02 15:04:05" // 数据库存储格式
)

// 实现GORM的Scannner接口
func (t *DateTime) Scan(value interface{}) error {
	switch v := value.(type) {
	case time.Time:
		*t = DateTime(v)
	case []byte:
		parsed, err := time.Parse(DatabaseFormat, string(v))
		if err != nil {
			return err
		}
		*t = DateTime(parsed)
	case string:
		parsed, err := time.Parse(DatabaseFormat, v)
		if err != nil {
			return err
		}
		*t = DateTime(parsed)
	case nil:
		*t = DateTime(time.Time{})
	default:
		return fmt.Errorf("无法解析时间类型: %T", value)
	}
	return nil
}

// 实现GORM的Valuer接口
func (t DateTime) Value() (driver.Value, error) {
	return time.Time(t).Format(DatabaseFormat), nil
}

// 实现JSON序列化
func (t DateTime) MarshalJSON() ([]byte, error) {
	return []byte(`"` + t.String() + `"`), nil
}

// 实现JSON反序列化
func (t *DateTime) UnmarshalJSON(data []byte) error {
	str := string(data)
	if str == "null" {
		return nil
	}
	parsed, err := time.Parse(`"`+TimeFormat+`"`, str)
	if err != nil {
		return err
	}
	*t = DateTime(parsed)
	return nil
}

// 字符串格式化
func (t DateTime) String() string {
	return time.Time(t).Format(TimeFormat)
}
